#include <iostream>
#include <stdlib.h>

using namespace std;

typedef struct Nodo{
    string dato;
    struct Nodo *siguiente;
}Nodo;

typedef struct {
    Nodo *inicio;
} Pila;

void inicializacion (Pila * tas){
    tas->inicio = NULL;
}

int apilar (Pila * tas, string dato){
    Nodo *nuevo_elemento;
    if ((nuevo_elemento = (Nodo *) malloc (sizeof (Nodo))) == NULL)
        return -1;

    nuevo_elemento->dato= dato;
    nuevo_elemento->siguiente = tas->inicio;
    tas->inicio = nuevo_elemento;
}

int desapilar (Pila * tas){
    Nodo *sup_elemento;
    if (tas->inicio==NULL)
        return -1;
    sup_elemento = tas->inicio;
    tas->inicio = tas->inicio->siguiente;
    free (sup_elemento);
    return 0;
}

void muestra (Pila * tas){
    Nodo *actual;

    actual = tas->inicio;
    if (actual==NULL) return;
    while(1)
    {
        cout<< actual->dato <<endl;
        if (!actual->siguiente) break;
        actual = actual->siguiente;
    }
}

int main()
{
    Pila *tas;
    string nom;
    int i;

    if ((tas = (Pila *) malloc (sizeof (Pila))) == NULL)
        return -1;

    inicializacion (tas);

    for(i=0;i<3;i++)
    {
        cout <<"Ingrese una palabra: ";
        cin>> nom;
        apilar (tas, nom);
        cout<<endl<<"********** Comienzo de PILA **********"<<endl;
        muestra(tas);
        cout<<endl<<"**********    Fin de PILA   **********"<<endl<<endl;
    }


    cout<<endl<<"Elimino el Ultimo nodo (LastInFirstOut)";
    desapilar (tas);
    cout<<endl<<"********** Comienzo de PILA **********"<<endl;
    muestra(tas);
    cout<<endl<<"**********    Fin de PILA   **********"<<endl<<endl;

    return 1;
}
